昨天我們為數位牧場申請了門牌地址,今天要為這個門牌安裝安全鎖!現在網路世界裡,沒有 HTTPS 的網站就像沒有鎖的大門,瀏覽器會狂發警告,用戶也不敢進來。幸好 Let's Encrypt 提供免費的 SSL 憑證,讓我們的牧場也能擁有五星級的安全防護!
Let's Encrypt 是一個免費、自動化、開放的憑證頒發機構(Certificate Authority, CA),由非營利組織 Internet Security Research Group (ISRG) 營運。
Let's Encrypt 的特點:
在我們的設定中:
# 更新套件清單
sudo apt update
# 安裝 Certbot
sudo apt install -y certbot
# 如果需要 DNS 插件,可以安裝(選用)
pip3 install certbot-dns-duckdns
# 申請 SSL 憑證
sudo certbot certonly \
--manual \
--preferred-challenges dns \
--email your-email@example.com \
--agree-tos \
-d "ithome-rancher.duckdns.org"
當執行上述指令時,Let's Encrypt 會要求你完成 DNS 挑戰:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for ithome-rancher.duckdns.org
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.ithome-rancher.duckdns.org.
with the following value:
ABC123def456GHI789jkl012MNO345pqr678STU901vwx
Before continuing, verify the TXT record has been deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
在另一個終端機中設定 TXT 記錄:
# 設定 TXT 記錄用於 DNS 挑戰
curl "https://www.duckdns.org/update?domains=ithome-rancher&token=your-duckdns-token&txt=ABC123def456GHI789jkl012MNO345pqr678STU901vwx"
# 預期回應:OK
# 確認 TXT 記錄已生效
dig TXT _acme-challenge.ithome-rancher.duckdns.org
# 或使用 nslookup
nslookup -type=TXT _acme-challenge.ithome-rancher.duckdns.org
確認 TXT 記錄生效後,回到 certbot 終端機按 Enter 繼續。
成功後會看到類似訊息:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ithome-rancher.duckdns.org/fullchain.pem
Key is saved at: /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem
This certificate expires on 2025-11-21.
These files will be updated when the certificate renews.
NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.
# 查看憑證檔案結構
sudo ls -la /etc/letsencrypt/live/ithome-rancher.duckdns.org/
# 檔案說明:
# cert.pem # 你的憑證(只有主憑證)
# chain.pem # 中繼憑證鏈
# fullchain.pem # 完整憑證鏈(cert + chain)
# privkey.pem # 私鑰
# README # 說明檔案
為什麼都用 .pem 副檔名?
PEM 格式使用不同的副檔名來區別檔案內容:
1. .pem
2. .crt 或 .cert
3. .key
4. .csr
Let's Encrypt 統一使用 .pem 副檔名,但用檔名前綴來區別:
重要提醒:Let's Encrypt 現在預設使用 ECDSA(橢圓曲線數位簽名演算法)而非傳統的 RSA 演算法。
ECDSA vs RSA 比較:
這就是為什麼會看到 Not an RSA key
錯誤!
你可以用以下指令確認憑證類型:
# 檢查憑證使用的演算法
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -text -noout | grep "Public Key Algorithm"
# 檢查私鑰類型
sudo openssl pkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem -text -noout | head -5
# 查看憑證詳細資訊
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -text -noout
# 查看憑證有效期(最重要!)
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -noout -dates
# 輸出範例:
# notBefore=Aug 23 00:00:00 2025 GMT
# notAfter=Nov 21 23:59:59 2025 GMT
# 查看憑證主體和頒發者
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -noout -subject -issuer
# 驗證憑證與私鑰匹配
# 注意:Let's Encrypt 現在使用 ECDSA 而非 RSA,要用 pkey 指令
sudo openssl x509 -noout -pubkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem > /tmp/cert_pubkey.pem
sudo openssl pkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem -pubout > /tmp/priv_pubkey.pem
# 比較兩個公鑰檔案,如果沒有輸出就表示匹配
diff /tmp/cert_pubkey.pem /tmp/priv_pubkey.pem
echo "如果上面沒有任何輸出,表示憑證和私鑰配對正確!"
# 清理暫存檔案
rm -f /tmp/cert_pubkey.pem /tmp/priv_pubkey.pem
1. 如果看到 "Not an RSA key" 錯誤
這個錯誤很常見,但完全正常!原因如下:
演算法變遷:
為什麼會出錯?
# 錯誤做法:使用 RSA 專用指令
openssl rsa -in privkey.pem -check
# 錯誤訊息:Not an RSA key
# 原因:ECDSA 私鑰不是 RSA 格式,所以 rsa 指令無法處理
正確做法:
# 使用通用的 pkey 指令(支援所有演算法)
sudo openssl pkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem -check
# pkey 可以處理:RSA、ECDSA、Ed25519 等各種演算法
ECDSA 的優勢:
2. 檢查憑證鏈結構
# 檢查憑證內容和格式
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/fullchain.pem -text -noout | grep -E "Subject:|Issuer:|Not Before|Not After"
# 檢查憑證鏈中有幾個憑證
sudo cat /etc/letsencrypt/live/ithome-rancher.duckdns.org/fullchain.pem | grep -c "BEGIN CERTIFICATE"
echo "上面的數字應該是 2(表示有你的憑證和中繼憑證)"
# 檢查憑證序號和指紋
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -noout -serial -fingerprint
今天我們成功為數位牧場安裝了安全鎖!透過 Let's Encrypt 免費服務,我們取得了有效的 SSL 憑證,並完成了基本的設定與驗證。
重點回顧:
明天我們將進入第二週的重頭戲,開始建置網路基礎設施並準備部署 RKE2 管理叢集。在此之前,我們需要先完成網路連通性的全面驗證!
💡 牧場主小提示:Let's Encrypt 憑證有效期只有 90 天,但這是故意的設計!短期憑證鼓勵自動化更新,反而比傳統一年期憑證更安全。記住,安全防護就像牧場的柵欄,要定期維護才能確保安全!